package venta;
import java.util.ArrayList;
import java.util.List;

import org.joda.time.DateTime;

import cliente.Cliente;
import producto.IProducto;
import producto.Pedido;
import producto.Producto;


public abstract class Venta {

	private Pedido pedido;
	private Cliente cliente;
	public List<Cancel> cancelaciones;
	private DateTime fechaDeVenta;
	
	public Venta(){
		
		setPedido(new Pedido());
		cliente = null;
		cancelaciones = new ArrayList<Cancel>();
		fechaDeVenta = null;
	}
	
	protected void setPedido(Pedido unPedido){
		this.pedido=unPedido;
	}
	
	public void asignarCliente(Cliente unCliente){
		this.cliente=unCliente;
	}
	
	public void agregarProducto(Producto unProducto){
		this.getPedido().agregar(unProducto);
	}
	
	public void agregarProducto(Producto unProducto,int unaCantidad){
		for (int i=0;i<unaCantidad;i++){
			agregarProducto(unProducto);
		}
	}
	
	public Pedido getPedido(){
		return this.pedido;
	}
	
	protected double importeTotalDeVenta() {
		return getPedido().precioDeVentaTotal();
	}
	
	public boolean conCliente(){
		return (this.cliente!=null);
	}
	
	public boolean sinCliente(){
		return (this.cliente==null);
	}
	
	protected void descontarStock(){
		getPedido().descontarStock();
	}
	
	protected void setFechaDeVenta(){
		this.fechaDeVenta = DateTime.now();
	}
	
	public void confirmarVenta(){
		this.descontarStock();
		this.setFechaDeVenta();	
	}

	public Cliente getCliente() {
		// TODO Auto-generated method stub
		//Sino tiene cliente deberia fallar?
		//ERROR SIN CLIENTE!!
		return this.cliente;
	}
	
	protected boolean elementosSinStock(){
		return this.getPedido().elementosSinStock();
	}
	
	public void cancelacionTotalNotaDeCredito(){
		//las cancelaciones solo deberian poder hacerce sobre ventas finalizadas
		//aca o en cancel? ej:
		if (this.fechaDeVenta==null){
			//ERROR!!
		}
		Cancel cancelacion = new CancelCtaCteFull(this);
		cancelacion.ejecutar();
		cancelaciones.add(cancelacion);
	}
	public void cancelacionParcialNotaDeCredito(IProducto unProducto){
		Cancel cancelacion = new CancelCtaCteParcial(this,unProducto);
		cancelacion.ejecutar();
		cancelaciones.add(cancelacion);
	}
	public void cancelacionParcialNotaDeCredito(Pedido unPedido){
		Cancel cancelacion = new CancelCtaCteParcial(this,unPedido);
		cancelacion.ejecutar();
		cancelaciones.add(cancelacion);
	}
	public void cancelacionTotal(){
		Cancel cancelacion = new CancelFull(this);
		cancelacion.ejecutar();
		cancelaciones.add(cancelacion);
	}
	public void cancelacionParcial(IProducto unProducto){
		Cancel cancelacion = new CancelParcial(this,unProducto);
		cancelacion.ejecutar();
		cancelaciones.add(cancelacion);
	}
	public void cancelacionParcial(Pedido unPedido){
		Cancel cancelacion = new CancelParcial(this,unPedido);
		cancelacion.ejecutar();
		cancelaciones.add(cancelacion);
	}
	
	protected void retornarProductos(){
		this.getPedido().retornarProductos();
	}

	
	/*
	public void CancelacionParcialNotaDeCredito(List<Presentacion> unaLista){
	}
	public void CancelacionTotalEfectivo(){
	}
	public void CancelacionParcialEfectivo(List<Presentacion> unaLista){
	}
	*/
	
}
